--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Interfaces/AutoInterface.py b051e76d00ab97baa948e69cdacadba3cf4739da (b051e76d) Text, 35.80 KB
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787Interface Tff7b72import Te6edf3Interface
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72import T7ee787socketserver
Tff7b72import T7ee787threading
Tff7b72import T7ee787re
Tff7b72import T7ee787socket
Tff7b72import T7ee787struct
Tff7b72import T7ee787time
Tff7b72import T7ee787sys
Tff7b72import T7ee787RNS
Tff7b72class T56d364AutoInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Te6edf3HW_MTU Tff7b72= T79c0ff1196
Te6edf3FIXED_MTU Tff7b72= Tff7b72True
Te6edf3DEFAULT_DISCOVERY_PORT Tff7b72= T79c0ff29716
Te6edf3DEFAULT_DATA_PORT Tff7b72= T79c0ff42671
Te6edf3DEFAULT_GROUP_ID Tff7b72= Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3DEFAULT_IFAC_SIZE Tff7b72= T79c0ff16
Te6edf3SCOPE_LINK Tff7b72= Ta5d6ff"Ta5d6ff2Ta5d6ff"
Te6edf3SCOPE_ADMIN Tff7b72= Ta5d6ff"Ta5d6ff4Ta5d6ff"
Te6edf3SCOPE_SITE Tff7b72= Ta5d6ff"Ta5d6ff5Ta5d6ff"
Te6edf3SCOPE_ORGANISATION Tff7b72= Ta5d6ff"Ta5d6ff8Ta5d6ff"
Te6edf3SCOPE_GLOBAL Tff7b72= Ta5d6ff"Ta5d6ffeTa5d6ff"
Te6edf3MULTICAST_PERMANENT_ADDRESS_TYPE Tff7b72= Ta5d6ff"Ta5d6ff0Ta5d6ff"
Te6edf3MULTICAST_TEMPORARY_ADDRESS_TYPE Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"
Te6edf3PEERING_TIMEOUT Tff7b72= T79c0ff22.0
Te6edf3ANNOUNCE_INTERVAL Tff7b72= T79c0ff1.6
Te6edf3PEER_JOB_INTERVAL Tff7b72= T79c0ff4.0
Te6edf3MCAST_ECHO_TIMEOUT Tff7b72= T79c0ff6.5
Te6edf3ALL_IGNORE_IFS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6fflo0Ta5d6ff"Tb4b4b4]
Te6edf3DARWIN_IGNORE_IFS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffawdl0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffllw0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflo0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffen5Ta5d6ff"Tb4b4b4]
Te6edf3ANDROID_IGNORE_IFS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffdummy0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffloTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftun0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrmnet0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrmnet1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrmnet2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrmnet3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrmnet4Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrmnet5Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrmnet6Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrmnet7Ta5d6ff"Tb4b4b4]
Te6edf3BITRATE_GUESS Tff7b72= T79c0ff10Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Te6edf3MULTI_IF_DEQUE_LEN Tff7b72= T79c0ff48
Te6edf3MULTI_IF_DEQUE_TTL Tff7b72= T79c0ff0.75
Tff7b72def Td2a8ffhandler_factoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffcreate_handlerTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3AutoInterfaceHandlerTb4b4b4(Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)
Tff7b72return Te6edf3create_handler
Tff7b72def Td2a8ffdescope_linklocalTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3link_local_addrTb4b4b4)Tb4b4b4:
T8b949e# Drop scope specifier expressd as %ifname (macOS)
Te6edf3link_local_addr Tff7b72= Te6edf3link_local_addrTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
T8b949e# Drop embedded scope specifier (NetBSD, OpenBSD)
Te6edf3link_local_addr Tff7b72= Te6edf3reTff7b72.Td2a8ffsubTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6fffe80:[0-9a-f]*::Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6fffe80::Ta5d6ff"Tb4b4b4, Te6edf3link_local_addrTb4b4b4)
Tff7b72return Te6edf3link_local_addr
Tff7b72def Td2a8fflist_interfacesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3ifs Tff7b72= Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffinterfacesTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3ifs
Tff7b72def Td2a8fflist_addressesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Te6edf3ifas Tff7b72= Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffifaddressesTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72return Te6edf3ifas
Tff7b72def Td2a8ffinterface_name_to_indexTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
T8b949e# socket.if_nametoindex doesn't work with uuid interface names on windows, it wants the ethernet_0 style
T8b949e# we will just get the index from netinfo instead as it seems to work
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffinterface_names_to_indexesTb4b4b4(Tb4b4b4)Tb4b4b4[Te6edf3ifnameTb4b4b4]
Tff7b72return Te6edf3socketTff7b72.Td2a8ffif_nametoindexTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3configurationTb4b4b4)Tb4b4b4:
Te6edf3c Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffget_config_objTb4b4b4(Te6edf3configurationTb4b4b4)
Te6edf3name Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3group_id Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffgroup_idTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffgroup_idTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3discovery_scope Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_scopeTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_scopeTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3discovery_port Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_portTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3multicast_address_type Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmulticast_address_typeTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffmulticast_address_typeTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3data_port Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffdata_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffdata_portTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3allowed_interfaces Tff7b72= Te6edf3cTff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffdevicesTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffdevicesTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3ignored_interfaces Tff7b72= Te6edf3cTff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffignored_devicesTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffignored_devicesTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3configured_bitrate Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffconfigured_bitrateTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffconfigured_bitrateTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Tff7b72from T7ee787RNST7ee787.T7ee787Interfaces Tff7b72import Te6edf3netinfo
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnetinfo Tff7b72= Te6edf3netinfo
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffHW_MTU
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fffinal_init_done Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffpeers Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fflink_local_addresses Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffadopted_interfaces Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffinterface_servers Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffmulticast_echoes Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffinitial_echoes Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fftimed_out_interfaces Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffspawned_interfaces Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffwrite_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmif_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTI_IF_DEQUE_LENTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmif_deque_times Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTI_IF_DEQUE_LENTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcarrier_changed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffoutbound_udp_socket Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_target Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_interval Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffANNOUNCE_INTERVAL
Tff7b72selfTff7b72.Td2a8ffpeer_job_interval Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffPEER_JOB_INTERVAL
Tff7b72selfTff7b72.Td2a8ffpeering_timeout Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffPEERING_TIMEOUT
Tff7b72selfTff7b72.Td2a8ffmulticast_echo_timeout Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMCAST_ECHO_TIMEOUT
Tff7b72selfTff7b72.Td2a8ffreverse_peering_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_intervalTff7b72*T79c0ff3.25
T8b949e# Increase peering timeout on Android, due to potential
T8b949e# low-power modes implemented on many chipsets.
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeering_timeout Tff7b72*Tff7b72= T79c0ff1.25
Tff7b72if Te6edf3allowed_interfaces Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_interfaces Tff7b72= Te6edf3allowed_interfaces
Tff7b72if Te6edf3ignored_interfaces Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffignored_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffignored_interfaces Tff7b72= Te6edf3ignored_interfaces
Tff7b72if Te6edf3group_id Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffgroup_id Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffDEFAULT_GROUP_ID
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffgroup_id Tff7b72= Te6edf3group_idTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3discovery_port Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_port Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffDEFAULT_DISCOVERY_PORT
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_port Tff7b72= Te6edf3discovery_port
Tff7b72selfTff7b72.Td2a8ffunicast_discovery_port Tff7b72= Tff7b72selfTff7b72.Td2a8ffdiscovery_portTff7b72+T79c0ff1
Tff7b72if Te6edf3multicast_address_type Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_address_type Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTICAST_TEMPORARY_ADDRESS_TYPE
Tff7b72elif Tffa657strTb4b4b4(Te6edf3multicast_address_typeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fftemporaryTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_address_type Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTICAST_TEMPORARY_ADDRESS_TYPE
Tff7b72elif Tffa657strTb4b4b4(Te6edf3multicast_address_typeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffpermanentTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_address_type Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTICAST_PERMANENT_ADDRESS_TYPE
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_address_type Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTICAST_TEMPORARY_ADDRESS_TYPE
Tff7b72if Te6edf3data_port Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata_port Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffDEFAULT_DATA_PORT
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata_port Tff7b72= Te6edf3data_port
Tff7b72if Te6edf3discovery_scope Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_LINK
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_LINK
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffadminTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_ADMIN
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffsiteTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_SITE
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fforganisationTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_ORGANISATION
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffglobalTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_GLOBAL
Tff7b72selfTff7b72.Td2a8ffgroup_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffgroup_idTb4b4b4)
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffgroup_hash
T8b949e#gt = "{:02x}".format(g[1]+(g[0]<<8))
Te6edf3gt Tff7b72= Ta5d6ff"Ta5d6ff0Ta5d6ff"
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff3Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff2Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff5Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff4Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff7Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff6Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff9Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff8Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff11Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff10Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff13Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff12Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmcast_discovery_address Tff7b72= Ta5d6ff"Ta5d6ffffTa5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffmulticast_address_typeTff7b72+Tff7b72selfTff7b72.Td2a8ffdiscovery_scopeTff7b72+Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Te6edf3gt
Te6edf3suitable_interfaces Tff7b72= T79c0ff0
Tff7b72for Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fflist_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_darwinTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3ifname Tff7b72in Te6edf3AutoInterfaceTff7b72.Td2a8ffDARWIN_IGNORE_IFS Tff7b72and Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff skipping Darwin AWDL or tethering interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elif Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_darwinTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3ifname Tff7b72== Ta5d6ff"Ta5d6fflo0Ta5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff skipping Darwin loopback interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elif Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3ifname Tff7b72in Te6edf3AutoInterfaceTff7b72.Td2a8ffANDROID_IGNORE_IFS Tff7b72and Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff skipping Android system interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elif Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffignored_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff ignoring disallowed interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elif Te6edf3ifname Tff7b72in Te6edf3AutoInterfaceTff7b72.Td2a8ffALL_IGNORE_IFSTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff skipping interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffallowed_interfacesTb4b4b4) Tff7b72> T79c0ff0 Tff7b72and Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff ignoring interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since it was not allowedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3addresses Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_addressesTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffAF_INET6 Tff7b72in Te6edf3addressesTb4b4b4:
Te6edf3link_local_addr Tff7b72= Tff7b72None
Tff7b72for Te6edf3address Tff7b72in Te6edf3addressesTb4b4b4[Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffAF_INET6Tb4b4b4]Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffaddrTa5d6ff" Tff7b72in Te6edf3addressTb4b4b4:
Tff7b72if Te6edf3addressTb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6fffe80:Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3link_local_addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffdescope_linklocalTb4b4b4(Te6edf3addressTb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink_local_addressesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_local_addrTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3link_local_addr
Tff7b72selfTff7b72.Td2a8ffmulticast_echoesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3nice_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffinterface_name_to_nice_nameTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Te6edf3nice_name Tff7b72!= Tff7b72None Tff7b72and Te6edf3nice_name Tff7b72!= Te6edf3ifnameTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff Selecting link-local address Tffd700{Te6edf3link_local_addrTffd700}Ta5d6ff for interface Tffd700{Te6edf3nice_nameTffd700}Ta5d6ff / Tffd700{Te6edf3ifnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff Selecting link-local address Tffd700{Te6edf3link_local_addrTffd700}Ta5d6ff for interface Tffd700{Te6edf3ifnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72if Te6edf3link_local_addr Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff No link-local IPv6 address configured for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, skipping interfaceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Creating unicast discovery listener on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with address Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3link_local_addrTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
T8b949e# Struct with interface index
Te6edf3if_struct Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ffITa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4)
T8b949e# Set up unicast discovery socket
Te6edf3unicast_discovery_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3unicast_discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEADDRTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3socketTb4b4b4, Ta5d6ff"Ta5d6ffSO_REUSEPORTTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3unicast_discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEPORTTb4b4b4, T79c0ff1Tb4b4b4)
T8b949e# Bind unicast discovery socket
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# Windows throws "[WinError 10049] The requested address is not valid in its context"
T8b949e# when trying to use the multicast address as host, or when providing interface index
T8b949e# passing an empty host appears to work, but probably not exactly how we want it to...
Te6edf3unicast_discovery_socketTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffunicast_discovery_portTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3link_local_addrTff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Te6edf3ifnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffunicast_discovery_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3unicast_discovery_socketTff7b72.Td2a8ffbindTb4b4b4(Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)
Te6edf3mcast_addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffmcast_discovery_address
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Creating multicast discovery listener on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with address Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3mcast_addrTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
T8b949e# Set up multicast discovery socket
Te6edf3discovery_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEADDRTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3socketTb4b4b4, Ta5d6ff"Ta5d6ffSO_REUSEPORTTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEPORTTb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_IPV6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffIPV6_MULTICAST_IFTb4b4b4, Te6edf3if_structTb4b4b4)
T8b949e# Join multicast group
Te6edf3mcast_group Tff7b72= Te6edf3socketTff7b72.Td2a8ffinet_ptonTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3mcast_addrTb4b4b4) Tff7b72+ Te6edf3if_struct
Te6edf3discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_IPV6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffIPV6_JOIN_GROUPTb4b4b4, Te6edf3mcast_groupTb4b4b4)
T8b949e# Bind multicast socket
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# Windows throws "[WinError 10049] The requested address is not valid in its context"
T8b949e# when trying to use the multicast address as host, or when providing interface index
T8b949e# passing an empty host appears to work, but probably not exactly how we want it to...
Te6edf3discovery_socketTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffdiscovery_portTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72== Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_LINKTb4b4b4:
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3mcast_addrTff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Te6edf3ifnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdiscovery_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3mcast_addrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdiscovery_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3discovery_socketTff7b72.Td2a8ffbindTb4b4b4(Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)
T8b949e# Set up thread for multicast discovery packets
Tff7b72def Td2a8ffdiscovery_loopTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdiscovery_handlerTb4b4b4(Te6edf3discovery_socketTb4b4b4, Te6edf3ifnameTb4b4b4)
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3discovery_loopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# Set up thread for unicast discovery packets
Tff7b72def Td2a8ffunicast_discovery_loopTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdiscovery_handlerTb4b4b4(Te6edf3unicast_discovery_socketTb4b4b4, Te6edf3ifnameTb4b4b4, Te6edf3announceTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3unicast_discovery_loopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3suitable_interfaces Tff7b72+Tff7b72= T79c0ff1
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3nice_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffinterface_name_to_nice_nameTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Te6edf3nice_name Tff7b72!= Tff7b72None Tff7b72and Te6edf3nice_name Tff7b72!= Te6edf3ifnameTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not configure the system interface Tffd700{Te6edf3nice_nameTffd700}Ta5d6ff / Tffd700{Te6edf3ifnameTffd700}Ta5d6ff for use with Tffd700{Tff7b72selfTffd700}Ta5d6ff, skipping it. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not configure the system interface Tffd700{Te6edf3ifnameTffd700}Ta5d6ff for use with Tffd700{Tff7b72selfTffd700}Ta5d6ff, skipping it. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3suitable_interfaces Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff could not autoconfigure. This interface currently provides no connectivity.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72if Te6edf3configured_bitrate Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3configured_bitrate
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffBITRATE_GUESS
Tff7b72def Td2a8fffinal_initTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peering_wait Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_intervalTff7b72*T79c0ff1.2
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff discovering peers for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3peering_waitTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff seconds...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3socketserverTff7b72.Td2a8ffUDPServerTff7b72.Td2a8ffaddress_family Tff7b72= Te6edf3socketTff7b72.Td2a8ffAF_INET6
Tff7b72for Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4:
Te6edf3local_addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4)
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3local_addrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdata_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3address Tff7b72= Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]
Te6edf3udp_server Tff7b72= Te6edf3socketserverTff7b72.Td2a8ffUDPServerTb4b4b4(Te6edf3addressTb4b4b4, Tff7b72selfTff7b72.Td2a8ffhandler_factoryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_serversTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3udp_server
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3udp_serverTff7b72.Td2a8ffserve_foreverTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3job_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffpeer_jobsTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3job_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3peering_waitTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fffinal_init_done Tff7b72= Tff7b72True
Tff7b72def Td2a8ffdiscovery_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3socketTb4b4b4, Te6edf3ifnameTb4b4b4, Te6edf3announceTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffannounce_loopTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffannounce_handlerTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Te6edf3announceTb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3announce_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3dataTb4b4b4, Te6edf3ipv6_src Tff7b72= Te6edf3socketTff7b72.Td2a8ffrecvfromTb4b4b4(T79c0ff1024Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fffinal_init_doneTb4b4b4:
Te6edf3peering_hash Tff7b72= Te6edf3dataTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Te6edf3expected_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffgroup_idTff7b72+Te6edf3ipv6_srcTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3peering_hash Tff7b72== Te6edf3expected_hashTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadd_peerTb4b4b4(Te6edf3ipv6_srcTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3ifnameTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff received peering packet on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ipv6_srcTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, but authentication hash was incorrect.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72def Td2a8ffpeer_jobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeer_job_intervalTb4b4b4)
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3timed_out_peers Tff7b72= Tb4b4b4[Tb4b4b4]
T8b949e# Check for timed out peers
Tff7b72for Te6edf3peer_addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3peer_addrTb4b4b4]
Te6edf3last_heard Tff7b72= Te6edf3peerTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3now Tff7b72> Te6edf3last_heardTff7b72+Tff7b72selfTff7b72.Td2a8ffpeering_timeoutTb4b4b4:
Te6edf3timed_out_peersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3peer_addrTb4b4b4)
T8b949e# Remove any timed out peers
Tff7b72for Te6edf3peer_addr Tff7b72in Te6edf3timed_out_peersTb4b4b4:
Te6edf3removed_peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3peer_addrTb4b4b4)
Tff7b72if Te6edf3peer_addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4:
Te6edf3spawned_interface Tff7b72= Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4[Te6edf3peer_addrTb4b4b4]
Te6edf3spawned_interfaceTff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff removed peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3peer_addrTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3removed_peerTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
T8b949e# Send reverse peering packets
Tff7b72for Te6edf3peer_addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3peer_addrTb4b4b4]
Te6edf3ifname Tff7b72= Te6edf3peerTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3last_outbound Tff7b72= Te6edf3peerTb4b4b4[T79c0ff2Tb4b4b4]
Tff7b72if Te6edf3now Tff7b72> Te6edf3last_outboundTff7b72+Tff7b72selfTff7b72.Td2a8ffreverse_peering_intervalTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreverse_announceTb4b4b4(Te6edf3ifnameTb4b4b4, Te6edf3peer_addrTb4b4b4)
Te6edf3peerTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while sending reverse peering packet to Tffd700{Te6edf3peer_addrTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72for Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4:
T8b949e# Check that the link-local address has not changed
Tff7b72tryTb4b4b4:
Te6edf3addresses Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_addressesTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffAF_INET6 Tff7b72in Te6edf3addressesTb4b4b4:
Te6edf3link_local_addr Tff7b72= Tff7b72None
Tff7b72for Te6edf3address Tff7b72in Te6edf3addressesTb4b4b4[Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffAF_INET6Tb4b4b4]Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffaddrTa5d6ff" Tff7b72in Te6edf3addressTb4b4b4:
Tff7b72if Te6edf3addressTb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6fffe80:Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3link_local_addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffdescope_linklocalTb4b4b4(Te6edf3addressTb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3link_local_addr Tff7b72!= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]Tb4b4b4:
Te6edf3old_link_local_address Tff7b72= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReplacing link-local address Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3old_link_local_addressTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3link_local_addrTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3link_local_addr
Tff7b72selfTff7b72.Td2a8fflink_local_addressesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_local_addrTb4b4b4)
Tff7b72if Te6edf3old_link_local_address Tff7b72in Tff7b72selfTff7b72.Td2a8fflink_local_addressesTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink_local_addressesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3old_link_local_addressTb4b4b4)
Te6edf3local_addr Tff7b72= Te6edf3link_local_addrTff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Te6edf3ifname
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3local_addrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdata_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3listen_address Tff7b72= Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]
Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffinterface_serversTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffShutting down previous UDP listener for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3previous_server Tff7b72= Tff7b72selfTff7b72.Td2a8ffinterface_serversTb4b4b4[Te6edf3ifnameTb4b4b4]
Tff7b72def Td2a8ffshutdown_serverTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3previous_serverTff7b72.Td2a8ffshutdownTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3shutdown_serverTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting new UDP listener for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3retry_delay Tff7b72= T79c0ff1.25
Te6edf3listener_started Tff7b72= Tff7b72False
Tff7b72while Tff7b72not Te6edf3listener_startedTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3retry_delayTb4b4b4)
Te6edf3udp_server Tff7b72= Te6edf3socketserverTff7b72.Td2a8ffUDPServerTb4b4b4(Te6edf3listen_addressTb4b4b4, Tff7b72selfTff7b72.Td2a8ffhandler_factoryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_serversTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3udp_server
Te6edf3listener_started Tff7b72= Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not start new UDP listener for Tffd700{Tff7b72selfTffd700}Ta5d6ff on Tffd700{Te6edf3listen_addressTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRetrying in Tffd700{Te6edf3retry_delayTffd700}Ta5d6ff secondsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3udp_serverTff7b72.Td2a8ffserve_foreverTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcarrier_changed Tff7b72= Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not get device information while updating link-local addresses for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
T8b949e# Check multicast echo timeouts
Te6edf3last_multicast_echo Tff7b72= T79c0ff0
Te6edf3multicast_echo_received Tff7b72= Tff7b72False
Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffmulticast_echoesTb4b4b4: Te6edf3last_multicast_echo Tff7b72= Tff7b72selfTff7b72.Td2a8ffmulticast_echoesTb4b4b4[Te6edf3ifnameTb4b4b4]
Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffinitial_echoesTb4b4b4: Te6edf3multicast_echo_received Tff7b72= Tff7b72True
Tff7b72if Te6edf3now Tff7b72- Te6edf3last_multicast_echo Tff7b72> Tff7b72selfTff7b72.Td2a8ffmulticast_echo_timeoutTb4b4b4:
Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fftimed_out_interfaces Tff7b72and Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72== Tff7b72FalseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarrier_changed Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMulticast echo timeout for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Carrier lost.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fftimed_out_interfaces Tff7b72and Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72== Tff7b72TrueTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarrier_changed Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Carrier recovered on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Tff7b72False
Tff7b72if Tff7b72not Te6edf3multicast_echo_receivedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff No multicast echoes received on Tffd700{Te6edf3ifnameTffd700}Ta5d6ff. The networking hardware or a firewall may be blocking multicast traffic.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
T8b949e# else:
T8b949e# RNS.log(f"{self} Initial multicast echo on {ifname} received {RNS.prettytime(time.time()-self.initial_echoes[ifname])} ago.", RNS.LOG_DEBUG)
Tff7b72def Td2a8ffannounce_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_announceTb4b4b4(Te6edf3ifnameTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffannounce_intervalTb4b4b4)
Tff7b72def Td2a8ffreverse_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4, Te6edf3peer_addrTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3link_local_address Tff7b72= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]
Te6edf3discovery_token Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffgroup_idTff7b72+Te6edf3link_local_addressTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3announce_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3peer_addrTffd700}Ta5d6ff%Tffd700{Te6edf3ifnameTffd700}Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffunicast_discovery_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3ifis Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ffITa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4)
Te6edf3announce_socketTff7b72.Td2a8ffsendtoTb4b4b4(Te6edf3discovery_tokenTb4b4b4, Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)
Te6edf3announce_socketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not send reverse peering packet to Tffd700{Te6edf3peer_addrTffd700}Ta5d6ff on Tffd700{Te6edf3ifnameTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffpeer_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3link_local_address Tff7b72= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]
Te6edf3discovery_token Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffgroup_idTff7b72+Te6edf3link_local_addressTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3announce_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmcast_discovery_addressTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdiscovery_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3ifis Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ffITa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4)
Te6edf3announce_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_IPV6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffIPV6_MULTICAST_IFTb4b4b4, Te6edf3ifisTb4b4b4)
Te6edf3announce_socketTff7b72.Td2a8ffsendtoTb4b4b4(Te6edf3discovery_tokenTb4b4b4, Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)
Te6edf3announce_socketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fftimed_out_interfaces Tff7b72and Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72== Tff7b72FalseTb4b4b4) Tff7b72or Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Detected possible carrier loss on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72pass
Tf0883e@property
Tff7b72def Td2a8ffpeer_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4)
Tff7b72def Td2a8ffadd_peerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3addrTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3addr Tff7b72in Tff7b72selfTff7b72.Td2a8fflink_local_addressesTb4b4b4:
Te6edf3ifname Tff7b72= Tff7b72None
Tff7b72for Te6edf3interface_name Tff7b72in Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3interface_nameTb4b4b4] Tff7b72== Te6edf3addrTb4b4b4:
Te6edf3ifname Tff7b72= Te6edf3interface_name
Tff7b72if Te6edf3ifname Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_echoesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffinitial_echoesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffinitial_echoesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff received multicast echo on unexpected interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3addrTb4b4b4] Tff7b72= Tb4b4b4[Te6edf3ifnameTb4b4b4, Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4]
Te6edf3spawned_interface Tff7b72= Te6edf3AutoInterfacePeerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3addrTb4b4b4, Te6edf3ifnameTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72selfTff7b72.Td2a8ffOUT
Te6edf3spawned_interfaceTff7b72.Td2a8ffIN Tff7b72= Tff7b72selfTff7b72.Td2a8ffIN
Te6edf3spawned_interfaceTff7b72.Td2a8ffingress_control Tff7b72= Tff7b72selfTff7b72.Td2a8ffingress_control
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_max_held_announces Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_max_held_announces
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_burst_hold Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_hold
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_burst_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_freq
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_burst_freq_new Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_freq_new
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_new_time Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_new_time
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_burst_penalty Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_penalty
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_held_release_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_held_release_interval
Te6edf3spawned_interfaceTff7b72.Td2a8ffegress_control Tff7b72= Tff7b72selfTff7b72.Td2a8ffegress_control
Te6edf3spawned_interfaceTff7b72.Td2a8ffec_pr_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffec_pr_freq
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_pr_burst_freq_new Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_pr_burst_freq_new
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_pr_burst_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_pr_burst_freq
Te6edf3spawned_interfaceTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72self
Te6edf3spawned_interfaceTff7b72.Td2a8ffbitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ffbitrate
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_size Tff7b72= Tff7b72selfTff7b72.Td2a8ffifac_size
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netname Tff7b72= Tff7b72selfTff7b72.Td2a8ffifac_netname
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netkey Tff7b72= Tff7b72selfTff7b72.Td2a8ffifac_netkey
Tff7b72if Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netname Tff7b72!= Tff7b72None Tff7b72or Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netkey Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72if Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netname Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netnameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netkey Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netkeyTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3ifac_origin_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3ifac_originTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_key Tff7b72= Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffhkdfTb4b4b4(
Te6edf3lengthTff7b72=T79c0ff64Tb4b4b4,
Te6edf3derive_fromTff7b72=Te6edf3ifac_origin_hashTb4b4b4,
Te6edf3saltTff7b72=Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffIFAC_SALTTb4b4b4,
Te6edf3contextTff7b72=Tff7b72None
Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_keyTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_signature Tff7b72= Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_keyTb4b4b4)Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffannounce_rate_target Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_rate_target
Te6edf3spawned_interfaceTff7b72.Td2a8ffannounce_rate_grace Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_rate_grace
Te6edf3spawned_interfaceTff7b72.Td2a8ffannounce_rate_penalty Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_rate_penalty
Te6edf3spawned_interfaceTff7b72.Td2a8ffmode Tff7b72= Tff7b72selfTff7b72.Td2a8ffmode
Te6edf3spawned_interfaceTff7b72.Td2a8ffHW_MTU Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_MTU
Te6edf3spawned_interfaceTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffadd_interfaceTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Tff7b72if Te6edf3addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4[Te6edf3addrTb4b4b4]Tff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4[Te6edf3addrTb4b4b4]Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3addrTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4[Te6edf3addrTb4b4b4] Tff7b72= Te6edf3spawned_interface
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff added peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3addrTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrefresh_peerTb4b4b4(Te6edf3addrTb4b4b4)
Tff7b72def Td2a8ffrefresh_peerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3addrTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3addrTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while refreshing peer Tffd700{Te6edf3addrTffd700}Ta5d6ff on Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffprocess_incomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3addrTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonline Tff7b72and Te6edf3addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4[Te6edf3addrTb4b4b4]Tff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3addrTb4b4b4)
Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4: Tff7b72pass
Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffAutoInterface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72class T56d364AutoInterfacePeerTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3addrTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffaddr Tff7b72= Te6edf3addr
Tff7b72selfTff7b72.Td2a8ffifname Tff7b72= Te6edf3ifname
Tff7b72selfTff7b72.Td2a8ffpeer_addr Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffaddr_info Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffHW_MTU
Tff7b72selfTff7b72.Td2a8ffFIXED_MTU Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffFIXED_MTU
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffAutoInterfacePeer[Tffd700{Tff7b72selfTff7b72.Td2a8ffifnameTffd700}Ta5d6ff/Tffd700{Tff7b72selfTff7b72.Td2a8ffaddrTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72def Td2a8ffprocess_incomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3addrTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonline Tff7b72and Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3data_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3deque_hit Tff7b72= Tff7b72False
Tff7b72if Te6edf3data_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffmif_dequeTb4b4b4:
Tff7b72for Te6edf3te Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffmif_deque_timesTb4b4b4:
Tff7b72if Te6edf3teTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3data_hash Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3teTb4b4b4[T79c0ff1Tb4b4b4]Tff7b72+Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTI_IF_DEQUE_TTLTb4b4b4:
Te6edf3deque_hit Tff7b72= Tff7b72True
Tff7b72break
Tff7b72if Tff7b72not Te6edf3deque_hitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffrefresh_peerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaddrTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffmif_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3data_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffmif_deque_timesTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4[Te6edf3data_hashTb4b4b4, Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffownerTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffwrite_lockTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffoutbound_udp_socket Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffoutbound_udp_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpeer_addr Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffpeer_addr Tff7b72= Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaddrTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Tff7b72selfTff7b72.Td2a8ffifnameTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffaddr_info Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffaddr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeer_addrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffdata_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffoutbound_udp_socketTff7b72.Td2a8ffsendtoTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffaddr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not transmit on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72True
Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe interface Tffd700{Tff7b72selfTffd700}Ta5d6ff experienced an unrecoverable error and is being torn down.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffpanic_on_interface_errorTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe interface Tffd700{Tff7b72selfTffd700}Ta5d6ff is being torn down.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffaddr Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffspawned_interfacesTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffspawned_interfacesTff7b72.Td2a8ffpopTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaddrTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not remove Tffd700{Tff7b72selfTffd700}Ta5d6ff from parent interface on detach. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffremove_interfaceTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72class T56d364AutoInterfaceHandlerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)
Tff7b72def Td2a8ffhandleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ffrequestTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3addrTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────